/**
 * 找到数组中两个加起来和target一样的数字的下标
 */

// 双指针的方法, 其实就是两层循环和for循环是一样的.
function twoSum(arr, target) {
    let i=0; j=arr.length -1
    // 如果不是有序的, 那么这里需要进行排序,
    // 否则下面的也不是成立的.

    while(i<j) {
        if(arr[i] + arr[j] === target) return [i, j]
        else if(arr[i] + arr[j] < target) i ++
        else if(arr[i] + arr[j] > target) j --
        // 这里的break必须要有, 否则这里将会是死循环
        else break;
    }
}

const arr = [1, 2, 3, 4, 5, 6, 7, 8]
console.log(twoSum(arr, 3));


// 使用map方式
// 这种方式更加的简单
function twoSumV3(arr, target) {
    const map = new Map()

    for(let i =0; i<arr.length; i++) {
        const rest = target - arr[i]
        if(map.has(rest)) {
            return [map.get(rest), i]
        }else {
            map.set(arr[i], i)
        }
    }
    return null
}

console.log(twoSumV3(arr, 3));



// 这里其实更复杂, 其实, 只在while中就可以实现了的.
var twoSumV2 = function(nums, target) {
    if(!nums.length) return [];
    let num = nums.slice(0);
    nums.sort((x,y) => x-y);
    let l = 0,r = nums.length-1;
    while(l < r){
        if(nums[l] + nums[r] === target) break;
        else if(nums[l] + nums[r] < target){
            l++;
        }else{
            r--;
        }
    }
    l = num.indexOf(nums[l]);
    r = num.indexOf(nums[r]) === l ? num.indexOf(nums[r],l+1) : num.indexOf(nums[r])
    return [l,r];
};

console.log(twoSumV2(arr, 3));
